package mylab.commons.web.mvc;

import mylab.base.cache.CacheKey;
import mylab.base.model.entity.Entity;
import mylab.starters.mybatis.template.SuperService;
import org.springframework.lang.NonNull;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;

/**
 * 基于MP的 IService 新增了3个方法： getByIdCache
 * 其中：
 * 1，getByIdCache 方法 会先从缓存查询，后从DB查询 （取决于实现类）
 * 2、SuperService 上的方法
 *
 * @param <K> 实体的ID
 * @param <E> 实体
 */
public interface SuperCacheService<K extends Serializable, E extends Entity<K>>
        extends SuperService<K, E> {

    /**
     * 根据id 先查缓存，再查db
     *
     * @param id 主键
     * @return 对象
     */
    E getFromCache(K id);

    /**
     * 根据 key 查询缓存中存放的id，缓存不存在根据loader加载并写入数据，然后根据查询出来的id查询 实体
     *
     * @param key    缓存key
     * @param loader 加载器
     * @return 对象
     */
    E getByKey(CacheKey key, Function<CacheKey, K> loader);

    /**
     * 可能会缓存穿透
     *
     * @param ids    主键id
     * @param loader 回调
     * @return 对象集合
     */
    List<E> findByIds(@NonNull Collection<K> ids, Function<Collection<K>, Collection<E>> loader);

    /**
     * 刷新缓存
     */
    void refreshCache();

    /**
     * 清理缓存
     */
    void clearCache();
}
